// Player.ts
import { _decorator, Component, Vec3, Vec2, Input, input, EventTouch, math, Node, view } from 'cc';
import { GameManager } from './GameManager';
import { ObstacleData } from './ObstacleData';

const { ccclass, property } = _decorator;

@ccclass('Player')
export class Player extends Component {
    // 核心参数
    @property({ tooltip: "环形轨迹半径" })
    radius: number = 250;

    @property({ tooltip: "最大角速度(度/秒)" })
    maxAngularSpeed: number = 150;

    @property({ tooltip: "角加速度" })
    angularAccel: number = 80;

    @property({ type: Node, tooltip: "环形中心节点" })
    centerNode: Node = null!;

    @property({ tooltip: "移动速度" })
    moveSpeed: number = 200;

    // 碰撞与飞行参数
    @property({ tooltip: "碰撞时的飞出距离" })
    bounceRadiusOffset: number = 50;

    @property({ tooltip: "最大飞行距离（相对于初始半径）" })
    maxFlyDistanceRatio: number = 1.8; // 最大飞到初始半径的1.8倍

    @property({ tooltip: "角色碰撞半径" })
    playerCollideRadius: number = 20;

    @property({ tooltip: "障碍物尺寸（半宽）" })
    obstacleHalfWidth: number = 20;

    gameManager: GameManager = null!;


    // Player.ts 中添加新属性（控制变速效果）
@property({ tooltip: "外飞时的初始速度" })
flyOutInitialSpeed: number = 500;

@property({ tooltip: "外飞时的减速系数（值越小减速越快）" })
flyOutDecay: number = 0.94;

@property({ tooltip: "内飞时的初始加速度" })
flyInAccel: number = 300;

@property({ tooltip: "内飞时的最大速度" })
flyInMaxSpeed: number = 600;

// 新增状态变量
private currentFlySpeed: number = 0; // 当前飞行速度（用于变速控制）


    // 状态变量
    private currentAngle: number = 0; // 当前角度（度）
    private currentAngularSpeed: number = 0; // 当前角速度
    private isTouchLeft: boolean = false; // 左触摸状态
    private isTouchRight: boolean = false; // 右触摸状态
    public obstacles: Node[] = []; // 障碍物列表
    private isMovingToCenter: boolean = false; // 是否向中心移动
    private moveDirection: number = 1; // 1=向中心，-1=远离中心
    private isFlyingOut: boolean = false; // 是否处于向外飞行阶段

    protected onLoad(): void {
        // 自动获取GameManager引用（如果节点路径正确）
        const gameManagerNode = this.node.parent?.getChildByName("GameManager");
        if (gameManagerNode) {
            this.gameManager = gameManagerNode.getComponent(GameManager)!;
            if (!this.gameManager) {
                console.error("gameManager 节点上未找到 GameManager 组件！");
            }
        } else {
            console.error("未找到名为 gameManager 的节点！");
        }
    }

    start() {
        this.registerTouchEvents();
    }

    update(deltaTime: number) {
        if (!this.centerNode) return;

        if (this.isMovingToCenter) {
            // 更新角度（触摸控制旋转）
            this.updateAngularSpeed(deltaTime);
            this.currentAngle += this.currentAngularSpeed * deltaTime;
            this.currentAngle = (this.currentAngle % 360 + 360) % 360;
            
            // 更新位置（向中心/远离中心移动）
            this.updateRadialMovement(deltaTime);
            this.checkCollision();
        }
    }

    // 修改 updateRadialMovement 方法（实现变速逻辑）
private updateRadialMovement(deltaTime: number) {
    const centerPos = this.centerNode.position;
    const currentDistance = Vec3.distance(this.node.position, centerPos);
    const maxAllowedDistance = this.radius * this.maxFlyDistanceRatio;

    // 1. 外飞阶段：由快到慢（速度衰减）
    if (this.isFlyingOut && this.moveDirection === -1) {
        // 速度逐渐衰减（每帧乘以衰减系数）
        this.currentFlySpeed *= this.flyOutDecay;
        
        // 到达最大距离或速度过低时，切换为内飞
        if (currentDistance >= maxAllowedDistance || this.currentFlySpeed < 50) {
            this.isFlyingOut = false;
            this.moveDirection = 1; // 转向中心
            this.currentFlySpeed = 50; // 内飞初始速度（较慢）
        }
    }
    // 2. 内飞阶段：由慢到快（加速度递增）
    else if (this.moveDirection === 1) {
        // 速度逐渐增加（不超过最大速度）
        this.currentFlySpeed += this.flyInAccel * deltaTime;
        this.currentFlySpeed = Math.min(this.currentFlySpeed, this.flyInMaxSpeed);
    }

    // 计算移动距离（基于当前速度）
    const moveDistance = this.currentFlySpeed * deltaTime * this.moveDirection;
    let newDistance = currentDistance - moveDistance;

    // 到达中心判定
    if (newDistance < 10) {
        newDistance = 0;
        this.reachCenter();
        return;
    }

    // 更新位置
    const rad = this.currentAngle * (Math.PI / 180);
    const x = centerPos.x + Math.sin(rad) * newDistance;
    const y = centerPos.y + Math.cos(rad) * newDistance;
    this.node.position = new Vec3(x, y, 0);
}


    // 到达中心处理
    private reachCenter() {
        this.isMovingToCenter = false;
        this.gameManager.gameOver();
    }

// 替换原有的 updateAngularSpeed 方法
private updateAngularSpeed(deltaTime: number) {
    // 移除加速度累积，直接设置恒定速度
    if (this.isTouchLeft) {
        // 左触摸时保持固定的负速度（逆时针）
        this.currentAngularSpeed = -this.maxAngularSpeed;
    } else if (this.isTouchRight) {
        // 右触摸时保持固定的正速度（顺时针）
        this.currentAngularSpeed = this.maxAngularSpeed;
    } else {
        // 未触摸时立即停止旋转（或保留轻微惯性）
        this.currentAngularSpeed = 0;
        // 如果需要轻微惯性，可以改为：this.currentAngularSpeed *= 0.7;
    }
}

// 触摸事件注册
private registerTouchEvents() {
    input.on(Input.EventType.TOUCH_START, this.onTouchStart, this);
    input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
    input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);
    input.on(Input.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
}

// 触摸开始/移动：判断左右侧
private onTouchStart(event: EventTouch) {
    this.checkTouchSide(event.getLocation());
}

private onTouchMove(event: EventTouch) {
    this.checkTouchSide(event.getLocation());
}

private onTouchEnd() {
    this.isTouchLeft = false;
    this.isTouchRight = false;
}

// 判断触摸左右侧（屏幕中线为界）
private checkTouchSide(screenPos: Vec2) {
    const visibleSize = view.getVisibleSize();
    const halfWidth = visibleSize.width / 2;
    // this.isTouchLeft = screenPos.x < halfWidth;
    // this.isTouchRight = screenPos.x >= halfWidth;
    this.isTouchRight = true
}

// 碰撞检测
private checkCollision() {
    const playerPos = this.node.position;
    for (const obstacle of this.obstacles) {
        if (!obstacle.isValid) continue;

        const obsPos = obstacle.position;
        const distance = Vec3.distance(playerPos, obsPos);
        if (distance < this.playerCollideRadius + this.obstacleHalfWidth) {
            this.handleBounce(obstacle); // 触发碰撞逻辑
            break;
        }
    }
}

// 修改 handleBounce 方法（初始化外飞速度）
private handleBounce(obstacle: Node) {
    const centerPos = this.centerNode.position;
    
    // 计算飞行方向（中心→主角）
    const centerToPlayer = new Vec3(
        this.node.position.x - centerPos.x,
        this.node.position.y - centerPos.y,
        0
    ).normalize();

    // 初始化飞行状态
    this.isFlyingOut = true;
    this.moveDirection = -1; // 向外飞
    this.currentAngle = Math.atan2(centerToPlayer.x, centerToPlayer.y) * (180 / Math.PI);
    
    // 外飞初始速度（快速启动）
    this.currentFlySpeed = this.flyOutInitialSpeed;

    // 立即飞出一段距离（第一帧快速响应）
    const initialFly = centerToPlayer.multiplyScalar(this.currentFlySpeed * 0.02); // 0.02约为一帧时间
    this.node.position = this.node.position.add(initialFly);

    // 障碍物消失
    this.removeObstacle(obstacle);
    obstacle.destroy();
    this.unscheduleAllCallbacks();
}

// 开始向中心移动（游戏开始/重启时调用）
startMovingToCenter() {
    this.isMovingToCenter = true;
    this.moveDirection = 1; // 初始方向：向中心
    this.isFlyingOut = false;
}

// 重置玩家状态
public resetPlayerState() {
    this.currentAngle = 0;
    this.currentAngularSpeed = 0;
    this.isTouchLeft = false;
    this.isTouchRight = false;
    this.obstacles = [];
    this.isMovingToCenter = false;
    this.moveDirection = 1;
    this.isFlyingOut = false;
    // 重置位置到初始半径
    this.node.position = new Vec3(0, this.radius, 0);
      this.currentFlySpeed = 0; // 重置飞行速度
}

// 障碍物管理
addObstacle(obstacle: Node) {
    if (!this.obstacles.includes(obstacle)) {
        this.obstacles.push(obstacle);
    }
}

removeObstacle(obstacle: Node) {
    const index = this.obstacles.indexOf(obstacle);
    if (index > -1) {
        this.obstacles.splice(index, 1);
    }
}

// 清理事件
onDestroy() {
    input.off(Input.EventType.TOUCH_START, this.onTouchStart, this);
    input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
    input.off(Input.EventType.TOUCH_END, this.onTouchEnd, this);
    input.off(Input.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
}
}
